home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SuperHack
/
SuperHack CD.bin
/
CODING
/
CPP
/
WFC010.ZIP
/
SRC
/
CRAS.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-07
|
19KB
|
773 lines
#include <wfc.h>
#pragma hdrstop
/*
** Author: Samuel R. Blackburn
** CI$: 76300,326
** Internet: sammy@sed.csc.com
**
** You can use it any way you like as long as you don't try to sell it.
**
** Any attempt to sell WFC in source code form must have the permission
** of the original author. You can produce commercial executables with
** WFC but you can't sell WFC.
**
** Copyright, 1995, Samuel R. Blackburn
**
** $Workfile: $
** $Revision: $
** $Modtime: $
*/
#if defined( _DEBUG )
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
/*
** CRASAuthenticationMessageBlock
*/
CRemoteAccessServiceAuthenticationMessageBlock::CRemoteAccessServiceAuthenticationMessageBlock()
{
m_Initialize();
}
CRemoteAccessServiceAuthenticationMessageBlock::CRemoteAccessServiceAuthenticationMessageBlock( const RASAMB *source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceAuthenticationMessageBlock::CRemoteAccessServiceAuthenticationMessageBlock( const CRemoteAccessServiceAuthenticationMessageBlock& source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceAuthenticationMessageBlock::~CRemoteAccessServiceAuthenticationMessageBlock()
{
m_Initialize();
}
void CRemoteAccessServiceAuthenticationMessageBlock::m_Initialize( void )
{
::ZeroMemory( (RASAMB *) this, sizeof( RASAMB ) );
dwSize = sizeof( RASAMB );
}
void CRemoteAccessServiceAuthenticationMessageBlock::Copy( const RASAMB *source )
{
ASSERT( source != NULL );
if ( source == NULL )
{
m_Initialize();
return;
}
dwError = source->dwError;
bLana = source->bLana;
::strcpy( szNetBiosError, source->szNetBiosError );
}
void CRemoteAccessServiceAuthenticationMessageBlock::Copy( const CRemoteAccessServiceAuthenticationMessageBlock& source )
{
dwError = source.dwError;
bLana = source.bLana;
::strcpy( szNetBiosError, source.szNetBiosError );
}
BYTE CRemoteAccessServiceAuthenticationMessageBlock::GetLana( void ) const
{
return( bLana );
}
DWORD CRemoteAccessServiceAuthenticationMessageBlock::GetErrorCode( void ) const
{
return( dwError );
}
void CRemoteAccessServiceAuthenticationMessageBlock::GetErrorString( CString &return_string ) const
{
return_string = szNetBiosError;
}
/*
** CRemoteAccessServiceNetBEUIFramer
*/
CRemoteAccessServiceNetBEUIFramer::CRemoteAccessServiceNetBEUIFramer()
{
m_Initialize();
}
CRemoteAccessServiceNetBEUIFramer::CRemoteAccessServiceNetBEUIFramer( const RASPPPNBF *source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceNetBEUIFramer::CRemoteAccessServiceNetBEUIFramer( const CRemoteAccessServiceNetBEUIFramer& source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceNetBEUIFramer::~CRemoteAccessServiceNetBEUIFramer()
{
m_Initialize();
}
void CRemoteAccessServiceNetBEUIFramer::m_Initialize( void )
{
::ZeroMemory( (RASPPPNBF *) this, sizeof( RASPPPNBF ) );
dwSize = sizeof( RASPPPNBF );
}
void CRemoteAccessServiceNetBEUIFramer::Copy( const RASPPPNBF *source )
{
ASSERT( source != NULL );
if ( source == NULL )
{
m_Initialize();
return;
}
dwError = source->dwError;
dwNetBiosError = source->dwNetBiosError;
bLana = source->bLana;
::strcpy( szNetBiosError, source->szNetBiosError );
::strcpy( szWorkstationName, source->szWorkstationName );
}
void CRemoteAccessServiceNetBEUIFramer::Copy( const CRemoteAccessServiceNetBEUIFramer& source )
{
dwError = source.dwError;
dwNetBiosError = source.dwNetBiosError;
bLana = source.bLana;
::strcpy( szNetBiosError, source.szNetBiosError );
::strcpy( szWorkstationName, source.szWorkstationName );
}
BYTE CRemoteAccessServiceNetBEUIFramer::GetLana( void ) const
{
return( bLana );
}
DWORD CRemoteAccessServiceNetBEUIFramer::GetErrorCode( void ) const
{
return( dwError );
}
DWORD CRemoteAccessServiceNetBEUIFramer::GetNetBiosErrorCode( void ) const
{
return( dwNetBiosError );
}
void CRemoteAccessServiceNetBEUIFramer::GetErrorString( CString& return_string ) const
{
return_string = szNetBiosError;
}
void CRemoteAccessServiceNetBEUIFramer::GetWorkstationName( CString& return_string ) const
{
return_string = szWorkstationName;
}
/*
** CRemoteAccessServiceInternetworkPacketExchange
*/
CRemoteAccessServiceInternetworkPacketExchange::CRemoteAccessServiceInternetworkPacketExchange()
{
m_Initialize();
}
CRemoteAccessServiceInternetworkPacketExchange::CRemoteAccessServiceInternetworkPacketExchange( const RASPPPIPX * source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceInternetworkPacketExchange::CRemoteAccessServiceInternetworkPacketExchange( const CRemoteAccessServiceInternetworkPacketExchange& source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceInternetworkPacketExchange::~CRemoteAccessServiceInternetworkPacketExchange()
{
m_Initialize();
}
void CRemoteAccessServiceInternetworkPacketExchange::m_Initialize( void )
{
::ZeroMemory( (RASPPPIPX *) this, sizeof( RASPPPIPX ) );
dwSize = sizeof( RASPPPIPX );
}
void CRemoteAccessServiceInternetworkPacketExchange::Copy( const RASPPPIPX * source )
{
ASSERT( source != NULL );
if ( source == NULL )
{
m_Initialize();
return;
}
dwError = source->dwError;
::strcpy( szIpxAddress, source->szIpxAddress );
}
void CRemoteAccessServiceInternetworkPacketExchange::Copy( const CRemoteAccessServiceInternetworkPacketExchange& source )
{
dwError = source.dwError;
::strcpy( szIpxAddress, source.szIpxAddress );
}
DWORD CRemoteAccessServiceInternetworkPacketExchange::GetErrorCode( void ) const
{
return( dwError );
}
void CRemoteAccessServiceInternetworkPacketExchange::GetIPXAddress( CString& return_string ) const
{
return_string =szIpxAddress;
}
/*
** CRemoteAccessServiceInternetProtocol
*/
CRemoteAccessServiceInternetProtocol::CRemoteAccessServiceInternetProtocol()
{
m_Initialize();
}
CRemoteAccessServiceInternetProtocol::CRemoteAccessServiceInternetProtocol( const RASPPPIP * source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceInternetProtocol::CRemoteAccessServiceInternetProtocol( const CRemoteAccessServiceInternetProtocol& source )
{
m_Initialize();
Copy( source );
}
CRemoteAccessServiceInternetProtocol::~CRemoteAccessServiceInternetProtocol()
{
m_Initialize();
}
void CRemoteAccessServiceInternetProtocol::m_Initialize( void )
{
::ZeroMemory( (RASPPPIP *) this, sizeof( RASPPPIP ) );
dwSize = sizeof( RASPPPIP );
}
void CRemoteAccessServiceInternetProtocol::Copy( const RASPPPIP * source )
{
ASSERT( source != NULL );
if ( source == NULL )
{
m_Initialize();
return;
}
dwError = source->dwError;
::strcpy( szIpAddress, source->szIpAddress );
#if ! defined( WINNT35COMPATIBLE )
::strcpy( szServerIpAddress, source->szServerIpAddress );
#endif // WINNT35COMPATIBLE
}
void CRemoteAccessServiceInternetProtocol::Copy( const CRemoteAccessServiceInternetProtocol& source )
{
dwError = source.dwError;
::strcpy( szIpAddress, source.szIpAddress );
#if ! defined( WINNT35COMPATIBLE )
::strcpy( szServerIpAddress, source.szServerIpAddress );
#endif // WINNT35COMPATIBLE
}
DWORD CRemoteAccessServiceInternetProtocol::GetErrorCode( void ) const
{
return( dwError );
}
void CRemoteAccessServiceInternetProtocol::GetIPAddress( CString& return_string ) const
{
return_string = szIpAddress;
}
#if ! defined( WINNT35COMPATIBLE )
void CRemoteAccessServiceInternetProtocol::GetServerIPAddress( CString& return_string ) const
{
return_string = szServerIpAddress;
}
#endif // WINNT35COMPATIBLE
/*
** CRemoteAccessService
*/
CRemoteAccessService::CRemoteAccessService()
{
m_Initialize();
m_AutomaticallyClose = FALSE;
}
CRemoteAccessService::~CRemoteAccessService()
{
if ( m_AutomaticallyClose != FALSE )
{
Close();
}
m_Initialize();
}
BOOL CRemoteAccessService::Close( LPCTSTR name_of_connection )
{
ASSERT_VALID( this );
return( HangUp( name_of_connection ) );
}
BOOL CRemoteAccessService::Dial( LPCTSTR who_to_dial )
{
ASSERT_VALID( this );
ASSERT( who_to_dial != NULL );
if ( who_to_dial == NULL )
{
m_ErrorCode = ERROR_INVALID_PARAMETER;
return( FALSE );
}
RASDIALPARAMS dialing_parameters;
::ZeroMemory( &dialing_parameters, sizeof( dialing_parameters ) );
dialing_parameters.dwSize = sizeof( dialing_parameters );
::strcpy( dialing_parameters.szEntryName, who_to_dial );
m_ConnectionHandle = NULL;
m_ErrorCode = ::RasDial( &m_DialExtensions,
NULL,
&dialing_parameters,
1,
m_ConnectionCallbackFunctionPointer,
&m_ConnectionHandle );
if ( m_ErrorCode == 0 )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
HRASCONN CRemoteAccessService::GetConnection( LPCTSTR name_of_connection )
{
ASSERT_VALID( this );
if ( name_of_connection == NULL )
{
m_ErrorCode = ERROR_INVALID_PARAMETER;
return( NULL );
}
LPRASCONN connections = NULL;
DWORD number_of_entries = 0;
m_GetConnectionsIntoMemory( connections, number_of_entries );
HRASCONN return_value = NULL;
if ( m_ErrorCode == 0 )
{
DWORD index = 0;
while( index < number_of_entries )
{
if ( ::strcmpi( name_of_connection, connections[ index ].szEntryName ) == 0 )
{
return_value = connections[ index ].hrasconn;
index = number_of_entries;
}
index++;
}
}
delete [] connections;
return( return_value );
}
BOOL CRemoteAccessService::GetConnections( CStringArray& connection_names )
{
ASSERT_VALID( this );
connection_names.RemoveAll();
LPRASCONN connections = NULL;
DWORD number_of_entries = 0;
m_GetConnectionsIntoMemory( connections, number_of_entries );
BOOL return_value = FALSE;
if ( m_ErrorCode == 0 )
{
return_value = TRUE;
DWORD index = 0;
while( index < number_of_entries )
{
connection_names.Add( connections[ index ].szEntryName );
index++;
}
}
delete [] connections;
return( return_value );
}
BOOL CRemoteAccessService::GetConnectionStatus( void )
{
ASSERT_VALID( this );
m_ErrorCode = ::RasGetConnectStatus( m_ConnectionHandle, &m_ConnectionStatus );
if ( m_ErrorCode == 0 )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOL CRemoteAccessService::GetErrorCode( void ) const
{
ASSERT_VALID( this );
return( m_ErrorCode );
}
BOOL CRemoteAccessService::GetErrorString( CString& return_string )
{
ASSERT_VALID( this );
TCHAR string[ 4096 ];
::ZeroMemory( string, sizeof( string ) );
if ( ::RasGetErrorString( m_ErrorCode, string, sizeof( string ) ) == 0 )
{
return_string = string;
return( TRUE );
}
else
{
return_string.Empty();
return( FALSE );
}
}
BOOL CRemoteAccessService::GetPhoneBookEntries( CStringArray& phone_book_entries )
{
ASSERT_VALID( this );
phone_book_entries.RemoveAll();
DWORD size_of_buffer = 64 * sizeof( RASENTRYNAME );
DWORD number_of_bytes_needed = size_of_buffer;
DWORD number_of_entries = 0;
LPRASENTRYNAME memory_buffer = (LPRASENTRYNAME) new BYTE[ size_of_buffer ]; // Get room for 64 entries (to begin with)
if ( memory_buffer == NULL )
{
m_ErrorCode = ERROR_NOT_ENOUGH_MEMORY;
return( FALSE );
}
::ZeroMemory( memory_buffer, size_of_buffer );
memory_buffer->dwSize = sizeof( RASENTRYNAME );
m_ErrorCode = ::RasEnumEntries( NULL, NULL, memory_buffer, &number_of_bytes_needed, &number_of_entries );
if ( m_ErrorCode != 0 )
{
if ( m_ErrorCode == ERROR_BUFFER_TOO_SMALL || m_ErrorCode == ERROR_NOT_ENOUGH_MEMORY )
{
delete [] memory_buffer;
memory_buffer = (LPRASENTRYNAME) new BYTE[ number_of_bytes_needed ];
if ( memory_buffer == NULL )
{
m_ErrorCode = ERROR_NOT_ENOUGH_MEMORY;
return( FALSE );
}
::ZeroMemory( memory_buffer, number_of_bytes_needed );
memory_buffer->dwSize = sizeof( RASENTRYNAME );
m_ErrorCode = ::RasEnumEntries( NULL, NULL, memory_buffer, &number_of_bytes_needed, &number_of_entries );
}
}
BOOL return_value = FALSE;
if ( m_ErrorCode == 0 )
{
return_value = TRUE;
DWORD index = 0;
while( index < number_of_entries )
{
phone_book_entries.Add( memory_buffer[ index ].szEntryName );
index++;
}
}
delete [] memory_buffer;
return( return_value );
}
BOOL CRemoteAccessService::GetProtocolInformation( CRemoteAccessServiceAuthenticationMessageBlock& data_to_get )
{
ASSERT_VALID( this );
CRemoteAccessServiceAuthenticationMessageBlock return_data;
if ( ::RasGetProjectionInfo( m_ConnectionHandle, RASP_Amb, (LPVOID) (RASAMB *) &return_data, &return_data.dwSize ) == 0 )
{
data_to_get.Copy( return_data );
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOL CRemoteAccessService::GetProtocolInformation( CRemoteAccessServiceNetBEUIFramer& data_to_get )
{
ASSERT_VALID( this );
CRemoteAccessServiceNetBEUIFramer return_data;
if ( ::RasGetProjectionInfo( m_ConnectionHandle, RASP_PppNbf, (LPVOID) (RASPPPNBF *) &return_data, &return_data.dwSize ) == 0 )
{
data_to_get.Copy( return_data );
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOL CRemoteAccessService::GetProtocolInformation( CRemoteAccessServiceInternetworkPacketExchange& data_to_get )
{
ASSERT_VALID( this );
CRemoteAccessServiceInternetworkPacketExchange return_data;
if ( ::RasGetProjectionInfo( m_ConnectionHandle, RASP_PppIpx, (LPVOID) (RASPPPIPX *) &return_data, &return_data.dwSize ) == 0 )
{
data_to_get.Copy( return_data );
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOL CRemoteAccessService::GetProtocolInformation( CRemoteAccessServiceInternetProtocol& data_to_get )
{
ASSERT_VALID( this );
CRemoteAccessServiceInternetProtocol return_data;
if ( ::RasGetProjectionInfo( m_ConnectionHandle, RASP_PppIp, (LPVOID) (RASPPPIP *) &return_data, &return_data.dwSize ) == 0 )
{
data_to_get.Copy( return_data );
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOL CRemoteAccessService::HangUp( LPCTSTR name_of_connection )
{
ASSERT_VALID( this );
if ( name_of_connection == NULL )
{
m_ErrorCode = ::RasHangUp( m_ConnectionHandle );
m_ConnectionHandle = NULL;
}
else
{
HRASCONN temp_handle = GetConnection( name_of_connection );
m_ErrorCode = ::RasHangUp( temp_handle );
}
if ( m_ErrorCode == 0 )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
BOOL CRemoteAccessService::IsConnected( void )
{
ASSERT_VALID( this );
GetConnectionStatus();
if ( m_ConnectionStatus.rasconnstate == RASCS_Connected )
{
return( TRUE );
}
else
{
return( FALSE );
}
}
void CRemoteAccessService::m_GetConnectionsIntoMemory( LPRASCONN& connections, DWORD& number_of_connections )
{
ASSERT_VALID( this );
DWORD size_of_buffer = 64 * sizeof( RASCONN );
DWORD number_of_bytes_needed = size_of_buffer;
DWORD number_of_entries = 0;
LPRASCONN memory_buffer = (LPRASCONN) new BYTE[ size_of_buffer ]; // Get room for 64 entries (to begin with)
if ( memory_buffer == NULL )
{
m_ErrorCode = ERROR_NOT_ENOUGH_MEMORY;
return;
}
::ZeroMemory( memory_buffer, size_of_buffer );
memory_buffer->dwSize = sizeof( RASCONN );
m_ErrorCode = ::RasEnumConnections( memory_buffer, &number_of_bytes_needed, &number_of_entries );
if ( m_ErrorCode != 0 )
{
if ( m_ErrorCode == ERROR_BUFFER_TOO_SMALL || m_ErrorCode == ERROR_NOT_ENOUGH_MEMORY )
{
delete [] memory_buffer;
memory_buffer = (LPRASCONN) new BYTE[ number_of_bytes_needed ];
if ( memory_buffer == NULL )
{
m_ErrorCode = ERROR_NOT_ENOUGH_MEMORY;
return;
}
::ZeroMemory( memory_buffer, number_of_bytes_needed );
memory_buffer->dwSize = sizeof( RASCONN );
m_ErrorCode = ::RasEnumConnections( memory_buffer, &number_of_bytes_needed, &number_of_entries );
}
}
connections = memory_buffer;
number_of_connections = number_of_entries;
}
void CRemoteAccessService::m_Initialize( void )
{
ASSERT_VALID( this );
::ZeroMemory( &m_ConnectionStatus, sizeof( m_ConnectionStatus ) );
m_ConnectionStatus.dwSize = sizeof( m_ConnectionStatus );
::ZeroMemory( &m_DialExtensions, sizeof( m_DialExtensions ) );
m_DialExtensions.dwSize = sizeof( m_DialExtensions );
m_ErrorCode = 0;
m_ConnectionHandle = NULL;
m_ConnectionCallbackFunctionPointer = NULL;
}
BOOL CRemoteAccessService::Open( LPCTSTR what_to_open )
{
ASSERT_VALID( this );
return( Dial( what_to_open ) );
}
BOOL CRemoteAccessService::SetAutomaticallyClose( BOOL auto_close )
{
BOOL return_value = m_AutomaticallyClose;
m_AutomaticallyClose = auto_close;
return( return_value );
}
LPVOID CRemoteAccessService::SetConnectionCallback( LPVOID function_pointer )
{
LPVOID return_value = m_ConnectionCallbackFunctionPointer;
m_ConnectionCallbackFunctionPointer = function_pointer;
return( return_value );
}
DWORD CRemoteAccessService::SetDialOptions( DWORD dial_options )
{
DWORD return_value = m_DialExtensions.dwfOptions;
m_DialExtensions.dwfOptions = dial_options;
return( return_value );
}